#include <get_msgs_from_json.h>

agv_msgs::msg::Order get_agv_msgs_V_order(const Json::Value &json)
{
    agv_msgs::msg::Order msg;
    msg.timestamp = json["timestamp"].asString();
    msg.serialnumber = json["serialNumber"].asString();
    msg.orderid = json["orderId"].asString();
    msg.orderupdateid = json["orderUpdateId"].asUInt();
    msg.zonesetid = json["zoneSetId"].asString();
    for (auto &it : json["nodes"])
    {
        msg.nodes.push_back(get_agv_msgs_V_node(it));
    }

    return msg;
}
agv_msgs::msg::MapNode get_agv_msgs_V_node(const Json::Value &json)
{
    agv_msgs::msg::MapNode msg;
    msg.nodeid = json["nodeId"].asString();
    msg.sequenceid = json["sequenceId"].asUInt();
    msg.nodedescription = json["nodeDescription"].asString();
    msg.released = json["released"].asBool();
    for (auto &it : json["actions"])
    {
        msg.actions.push_back(get_agv_msgs_V_action(it));
    }

    return msg;
}

agv_msgs::msg::Action get_agv_msgs_V_action(const Json::Value &json)
{
    agv_msgs::msg::Action msg;
    msg.actiontype = json["actionType"].asString();
    msg.actionid = json["actionId"].asString();
    msg.actiondescription = json["actionDescription"].asString();
    msg.blockingtype = json["blockingType"].asString();

    for (auto &it : json["actionParameters"])
    {
        msg.actionparameters.push_back(get_agv_msgs_V_actionParam(it));
    }

    return msg;
}

agv_msgs::msg::ActionParam get_agv_msgs_V_actionParam(const Json::Value &json)
{
    agv_msgs::msg::ActionParam msg;
    msg.key = json["key"].asString();
    msg.value = json["value"].asString();
    msg.valuedatatype = json["valueDataType"].asString();

    return msg;
}

// agv_msgs::msg::RelocateRadius get_agv_msgs_RelocateRadius(const Json::Value &json)
// {
//     agv_msgs::msg::RelocateRadius msg;
//     msg.point = get_geometry_msgs_Point(json["point"]);
//     msg.radius = json["radius"].asFloat();

//     return msg;
// }

agv_msgs::msg::OutputPort get_agv_msgs_OutputPort(const Json::Value &json)
{
    agv_msgs::msg::OutputPort msg;
    msg.index = json["index"].asInt();
    msg.level = json["level"].asBool();

    return msg;
}

agv_msgs::msg::MapEditPoints get_agv_msgs_mapEdit_points(const Json::Value &json)
{
    agv_msgs::msg::MapEditPoints msg;
    msg.x = json["x"].asFloat();
    msg.y = json["y"].asFloat();

    return msg;
}

agv_msgs::msg::MapEditPoly get_agv_msgs_mapEdit_poly(const Json::Value &json)
{
    agv_msgs::msg::MapEditPoly msg;
    msg.attribute = json["attribute"].asInt();
    for (auto &it : json["apex_points"])
    {
        msg.apex_points.push_back(get_agv_msgs_mapEdit_points(it));
    }

    return msg;
}

agv_msgs::msg::MapEditErase get_agv_msgs_mapEdit_earse(const Json::Value &json)
{
    agv_msgs::msg::MapEditErase msg;
    msg.operate = json["operate"].asBool();
    for (auto &it : json["apex_poly"])
    {
        msg.apex_poly.push_back(get_agv_msgs_mapEdit_poly(it));
    }

    return msg;
}

agv_msgs::msg::MapEditTransform get_agv_msgs_mapEdit_Transform(const Json::Value &json)
{
    agv_msgs::msg::MapEditTransform msg;
    msg.operate = json["operate"].asBool();
    msg.angle = json["angle"].asFloat();
    msg.x = json["x"].asFloat();
    msg.y = json["y"].asFloat();
    msg.translation_x = json["translation_x"].asFloat();
    msg.translation_y = json["translation_y"].asFloat();

    return msg;
}

agv_msgs::msg::PeriphTeleop get_agv_msgs_PeriphTeleop(const Json::Value &json)
{
    agv_msgs::msg::PeriphTeleop msg;
    msg.order = json["order"].asUInt();
    msg.freq = json["freq"].asUInt();
    return msg;
}

// reflector_slam_ros::msg::reflectorLandmark get_reflector_slam_ros_reflectorLandmark(const Json::Value &json)
// {
//     reflector_slam_ros::msg::reflectorLandmark msg;
//     msg.reflector_num = json["reflector_num"].asInt();
//     msg.reflector_point = get_geometry_msgs_Point32(json["reflector_point"]);

//     return msg;
// }

geometry_msgs::msg::Point get_geometry_msgs_Point(const Json::Value &json)
{
    geometry_msgs::msg::Point msg;
    msg.x = json["x"].asFloat();
    msg.y = json["y"].asFloat();
    msg.z = json["z"].asFloat();

    return msg;
}

geometry_msgs::msg::Point32 get_geometry_msgs_Point32(const Json::Value &json)
{
    geometry_msgs::msg::Point32 msg;
    msg.x = json["x"].asFloat();
    msg.y = json["y"].asFloat();
    msg.z = json["z"].asFloat();

    return msg;
}

geometry_msgs::msg::Pose2D get_geometry_msgs_Pose2D(const Json::Value &json)
{
    geometry_msgs::msg::Pose2D msg;
    msg.x = json["x"].asFloat();
    msg.y = json["y"].asFloat();
    msg.theta = json["theta"].asFloat();

    return msg;
}

geometry_msgs::msg::Vector3 get_geometry_msgs_Vector3(const Json::Value &json)
{
    geometry_msgs::msg::Vector3 msg;
    msg.x = json["x"].asFloat();
    msg.y = json["y"].asFloat();
    msg.z = json["z"].asFloat();

    return msg;
}

geometry_msgs::msg::Twist get_geometry_msgs_Twist(const Json::Value &json)
{
    geometry_msgs::msg::Twist msg;
    msg.linear = get_geometry_msgs_Vector3(json["linear"]);
    msg.angular = get_geometry_msgs_Vector3(json["angular"]);

    return msg;
}

geometry_msgs::msg::TwistStamped get_geometry_msgs_TwistStamped(const Json::Value &json)
{
    geometry_msgs::msg::TwistStamped msg;
    msg.twist.linear = get_geometry_msgs_Vector3(json["linear"]);
    msg.twist.angular = get_geometry_msgs_Vector3(json["angular"]);

    return msg;
}

std_msgs::msg::UInt8 get_std_msgs_UInt8(const Json::Value &json)
{
    std_msgs::msg::UInt8 msg;
    msg.data = json["data"].asUInt();

    return msg;
}

std_msgs::msg::String get_std_msgs_String(const Json::Value &json)
{
    std_msgs::msg::String msg;
    msg.data = json["data"].asString();

    return msg;
}

std_msgs::msg::Bool get_std_msgs_Bool(const Json::Value &json)
{
    std_msgs::msg::Bool msg;
    msg.data = json["data"].asBool();
    return msg;
}